package com.teamin.mapper;

import com.teamin.entity.*;
import com.teamin.web.model.TaskQueryModel;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Set;

/**
 * 任务相关的数据库操作
 */
public interface TaskMapper {

    int deleteByPrimaryKey(Long id);

    /**
     * 添加任务 ID 会返回到 TaskEntity 中的taskId 中
     * taskName 任务名称
     * description 任务描述
     * planFinishTime 任务结束时间
     * assignerId 任务执行者
     * createrId (必) 任务创建者
     * @param record
     * @return
     */
    int addTask(TaskEntity record);

    /**
     * 查询任务
     * @param taskId (必) 任务ID
     * @return TaskEntity
     */
    TaskEntity selectByTask(@Param("taskId")Long taskId);

    /**
     * 查询任务的子任务
     * @return TaskEntity
     */
    List<TaskEntity> selectSubTask(@Param("taskId")Long parentTaskId);

    /**
     * 查询任务的子任务
     * @return TaskEntity
     */
    TaskEntity selectBaseTask(@Param("taskId")Long taskId);


    /**
     * 删除任务
     * taskId(必) 任务ID
     * @return
     */
    int deleteTask(Long taskId);

    /**
     * 更新任务
     * taskId(必) 任务ID
     * taskName 任务名称
     * description 任务描述
     * planFinishTime 任务结束时间
     * assignerId 任务执行者
     * createrId (必) 任务创建者
     * @param controllorId 
     * @return
     */
    int updateTask(@Param("task")TaskEntity record, @Param("controllorId") long controllorId);

    /**
     * 关联任务跟圈子
     * taskId(必) 任务ID
     * circleId(必) 圈子ID
     * @return 0表示失败,1表示成功
     */
    int addTaskToCircle(long circleId,Long taskId);

    /**
     * 查询圈子中的任务
     * @param circleId 圈子ID(必)
     * @param order 任务的 排序 11为创建时间倒序,21 为更新时间倒序
     * @param filter 任务的过滤
     */
    public List<TaskEntity> selectByCircle(@Param("circleId") Long circleId, @Param("order")Integer order,@Param("filter")String filter) ;

    /**
     * 查询圈子中的任务 第010 版
     * @param circleId 圈子ID(必)
     * @param order 任务的 排序 11为创建时间倒序,21 为更新时间倒序
     * @param filter 任务的过滤
     */
    public List<TaskEntity> selectByCircleV010(@Param("circleId") Long circleId, @Param("order")Integer order,@Param("filter")String filter,@Param("labels")List<String> labels,@Param("userId") Long userId,@Param("state") int state,@Param("assignerId")String assignerId) ;

    /**
     * 查询圈子中的任务 第010 版
     */
    public TaskEntity selectTaskV010(@Param("taskId") Long taskId,@Param("userId") Long userId,@Param("circleId") Long circleId) ;

    /**
     * 获取圈子中忆完成的任务
     * @param circleId 圈子ID(必)
     */
    public List<TaskEntity> selectFinishTask(@Param("circleId") Long circleId,@Param("filter")String filter) ;


    /**
     * 条件搜索任务
     * @param taskQueryModel
     * @return
     */
    public List<TaskEntity> queryTasks(TaskQueryModel taskQueryModel) ;

    /**
     * 查找已过期的任务,通知
     * @param taskQueryModel
     * @return
     */
    public List<TaskEntity> queryExpireTasks(TaskQueryModel taskQueryModel) ;


    /**
     * 关注任务
     * @param taskId 任务ID(必)
     * @param userId 用户ID(必)
     */
    public int addAttention(@Param("taskId") Long taskId, @Param("userId") Long userId) ;

    /**
     * 取消关注任务
     * @param taskId 任务ID(必)
     * @param userId 用户ID(必)
     */
    public int removeAttention(@Param("taskId") Long taskId, @Param("userId")Long userId) ;

    /**
     * 获取任务的关注列表
     * @param taskId 任务ID(必)
     */
    public Set<Long> getAttentionUserId(@Param("taskId")Long taskId) ;

    /**
     * 获取任务的关注列表
     * @param taskId 任务ID(必)
     */
    public List<UserEntity> getAttention(@Param("taskId") Long taskId) ;

    /**
     * 评论任务
     * @param taskId 评论的任务(必)
     * @param userId 评论的用户(必)
     * @param contentType 评论的类型 1 为文本信息,2表图片(必)
     * @param content 评论的内容(必)
     * @return
     */
    public int addComment(CommentEntity commentEntity) ;

    /**
     * 任务评论列表
     * @param taskId 评论的任务(必)
     * @return
     */
    public List<CommentEntity> getComment(@Param("taskId") Long taskId) ;
    
    /**
     * 查找一条评论
     * @param taskId 评论的任务(必)
     * @return
     */
    public CommentEntity getCommentById(@Param("commentId") Long commentId) ;
    
    /**
     * 删除一条评论
     * @param taskId 评论的任务(必)
     * @return
     */
    public int deleteCommentById(@Param("commentId") Long commentId) ;

    /**
     * 判断用对任务是否有操作权限
     * @param taskId 任务ID(必)
     * @param userId 用户ID(必)
     * @return
     */
    public boolean userControlTask(@Param("taskId") Long taskId,@Param("userId") Long userId) ;

    /**
     * 移除所有关注者
     * @param taskId
     * @return
     */
	int removeAllAttention(Long taskId);

    /**
     * 获取用户在圈子中的任务完成状态
     * @return
     */
    List<UserTaskStateEntity> getUserTaskState();

    /**
     * 获取用户的昵称
     * @return
     */
    String getUserNameByTask(@Param("taskId") Long taskId,@Param("userId") Long userId);

    /**
     * 更新用户查看任务评化的位置
     * @param taskId
     * @param userId
     * @return
     */
    int updateUserReadLastPosition(@Param("taskId") Long taskId,@Param("userId") Long userId);

    /**
     * 新增用户查看任务评化的位置
     * @param taskId
     * @param userId
     * @return
     */
    int insertUserReadLastPosition(@Param("taskId") Long taskId,@Param("userId") Long userId);

    /**
     * 查看用户是否存在用任评的查看
     * @param taskId
     * @param userId
     * @return
     */
    Boolean existUserReadLastPosition(@Param("taskId") Long taskId,@Param("userId") Long userId);


    /**
     * 更新任务提醒
     * @return
     */
    int updateTaskRemind(TaskRemindEntity taskRemindEntity);

    /**
     * 新增任务提醒
     * @return
     */
    int insertTaskRemind(TaskRemindEntity taskRemindEntity);

    /**
     * 查看是否存在任务提醒
     * @param taskId
     * @return
     */
    Boolean existTaskRemind(@Param("taskId") Long taskId);

    /**
     * 删除任务提醒
     * @param taskId
     * @return
     */
    int deleteTaskRemind(@Param("taskId") Long taskId);

    /**
     * 查看任务是否被删除,true为已删除,false为未删除
     * @param taskId
     * @return
     */
    Boolean isdeleted(@Param("taskId") Long taskId);

    /**
     * 查看任务是否是子任务,true为子任务,false 不是子任务
     * @param taskId
     * @return
     */
    Boolean isSubTask(@Param("taskId") Long taskId);

    /**
     * 查找任务的提醒
     * @param taskId
     * @return
     */
    TaskRemindEntity getTaskRemind(@Param("taskId") Long taskId);

    /**
     * 查找父任务ID
     * @param taskId
     * @return
     */
    Long getParentTaskId(@Param("taskId") Long taskId);

    /**
     * 查询圈子用户刚刚创建的任务
     * @Param circleId
     * @Param userId
     * @return
     */
    List<TaskEntity> selectJustCreateTask(@Param("circleId") Long circleId,@Param("userId") Long userId,@Param("limit") Long limit);


    /**
     * 查询圈子用户刚刚创建的任务的数量
     * @Param circleId
     * @Param userId
     * @return
     */
    Long selectJustCreateTaskCount(@Param("circleId") Long circleId,@Param("userId") Long userId);

    /**
     * 更新圈子用户查看刚刚创建的任务的时间
     * @Param circleId
     * @Param userId
     * @return
     */
    int updateJustCreateTaskTime(@Param("circleId") Long circleId,@Param("userId") Long userId);


    /**
     * 根据任务id，获取圈子id
     * @param taskId
     * @return
     */
    Integer getCircleIdByTaskId(Integer taskId);
}